package com.share.order.controller;

import com.share.common.core.web.controller.BaseController;
import com.share.common.core.web.domain.AjaxResult;
import com.share.common.rabbit.constant.MqConst;
import com.share.common.rabbit.service.RabbitService;
import com.share.order.config.DeadLetterMqConfig;
import com.share.order.config.DelayedMqConfig;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 消息队列测试控制器
 * 提供各类RabbitMQ消息发送的测试接口，用于验证消息队列配置和功能
 */
@Tag(name = "Mq接口管理", description = "消息队列相关接口，用于测试各种消息发送功能")
@RestController
@RequestMapping("/mq")
@RequiredArgsConstructor
public class MqController extends BaseController {

    /**
     * RabbitMQ消息发送服务，封装了各种消息发送的方法
     */
    private final RabbitService rabbitService;

    /**
     * 发送普通测试消息
     * 向测试交换机发送简单消息，用于验证基础消息发送功能
     *
     * @return 通用响应对象，表示操作成功
     */
    @Operation(summary = "发送普通测试消息", description = "向测试交换机发送简单文本消息，用于验证基础消息通信")
    @GetMapping("/sendMessage")
    public AjaxResult sendMessage() {
        // 发送消息到指定交换机和路由键，消息内容为"hello"
        rabbitService.sendMessage(MqConst.EXCHANGE_TEST, MqConst.ROUTING_TEST, "hello");
        return success();
    }

    /**
     * 发送确认模式测试消息
     * 用于测试消息确认机制是否正常工作
     *
     * @return 通用响应对象，表示操作成功
     */
    @Operation(summary = "发送确认消息", description = "发送用于测试消息确认机制的消息，验证消息是否被正确确认")
    @GetMapping("/sendConfirmMessage")
    public AjaxResult sendConfirmMessage() {
        // 发送消息到测试交换机，使用确认相关的路由键
        rabbitService.sendMessage(MqConst.EXCHANGE_TEST, MqConst.ROUTING_CONFIRM, "hello, confirm");
        return success();
    }

    /**
     * 发送基于死信队列实现的延迟消息
     * 测试通过死信队列机制实现的消息延迟功能
     *
     * @return 通用响应对象，表示操作成功
     */
    @Operation(summary = "发送延迟消息：基于死信实现", description = "通过死信队列机制发送延迟消息，延迟时间在队列配置中预设")
    @GetMapping("/sendDeadLetterMsg")
    public AjaxResult sendDeadLetterMsg() {
        // 发送消息到死信交换机，使用对应的路由键
        // 延迟时间由死信队列(queue_dead_1)的x-message-ttl参数指定
        rabbitService.sendMessage(DeadLetterMqConfig.exchange_dead, DeadLetterMqConfig.routing_dead_1, "我是延迟消息");
        return success();
    }

    /**
     * 发送基于延迟插件实现的延迟消息
     * 测试通过RabbitMQ延迟插件实现的灵活延迟消息功能
     *
     * @return 通用响应对象，表示操作成功
     */
    @Operation(summary = "发送延迟消息：基于延迟插件", description = "通过RabbitMQ延迟插件发送可自定义延迟时间的消息")
    @GetMapping("/sendDelayMsg")
    public AjaxResult sendDelayMsg() {
        // 设置延迟时间为10秒
        int delayTime = 10;
        // 调用专门的延迟消息发送方法，指定交换机、路由键、消息内容和延迟时间
        rabbitService.sendDealyMessage(DelayedMqConfig.exchange_delay, DelayedMqConfig.routing_delay, "我是延迟消息", delayTime);
        return success();
    }
}